module IOManager (
    input [7:0] maddr,     // 地址输入，表示内存地址
    input [3:0] mm,        // 内存操作模式
    input clk,             // 时钟信号
    input we,              // 写使能信号
    input [31:0] wdata,    // 写入数据
    output [31:0] data,    // 读取数据
    input [3:0] switch,    // 当maddr[6]=1时，将外设的输入作为输出
    output reg [31:0] result  // 当maddr[7]=1时，输出此时写入RAM中的数据
);

    wire memEnable;   // 内存使能信号
    wire mwe;         // 内存写使能信号
    wire [31:0] mwdata, mdata; // 内存数据输入和输出

    // 当地址的高两位不为11时使能内存访问
    assign memEnable = ~(maddr[7] | maddr[6]);
    assign mwe = memEnable & we;  // 当使能内存访问且写使能信号有效时使能内存写

    // 实例化RAM
    RAM myram (
        .maddr(maddr[5:0]),  // 地址低6位作为内存地址
        .mm(mm),             // 内存操作模式
        .clk(clk),           // 时钟信号
        .we(mwe),            // 写使能信号
        .mdata(mdata),       // 内存数据输出
        .mwdata(mwdata)      // 内存数据输入
    );

    // 根据maddr[6]选择数据来源：0表示内存数据，1表示开关输入
    assign data = maddr[6] ? {28'h0, switch} : mdata;
    assign mwdata = wdata;  // 写入数据

    // 当sw指令的地址maddr[7]==1时，表示输出结果
    always @(posedge clk) begin
        if (we & maddr[7]) begin
            result <= wdata;  // 将写入数据存入result寄存器
        end
    end

    // 监视信号变化
    initial begin
        $monitor($time, " IOManager: maddr=%h, mm=%b, wdata=%h, data=%h, switch=%b, result=%h",
                 maddr, mm, wdata, data, switch, result);
    end
endmodule
